package com.cms.controller;

import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cms.common.Result;

import java.io.File;

import com.cms.entity.Files;
import com.cms.mapper.FileMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import cn.hutool.core.io.FileUtil;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

import com.cms.common.AuthAccess;

@RestController
@RequestMapping("/file")
public class FileController {
    @Value("${ip:localhost}")
    String ip;//这一段需要检查application.yml有没有“ip：localhost这句”

    @Value("${server.port}")
    String port;

    @Value("${files.upload.path}")
    private String fileUploadPath;

    @Resource
    private FileMapper fileMapper;

    private  static final String ROOT_PATH = System.getProperty("user.dir") + File.separator + "files";


    /**
     * 文件上传
     */
    @PostMapping("/upload")
    public String upload(@RequestParam MultipartFile file) throws IOException{
        String originalFilename = file.getOriginalFilename();
        String type = FileUtil.extName(originalFilename);
        long size = file.getSize();
        //定义一个文件的唯一标识码
        String uuid = IdUtil.fastSimpleUUID();
        String fileUUID = uuid + StrUtil.DOT + type;

        File uploadFile = new File(fileUploadPath + fileUUID);
        //判断配置的文件目录是否存在，若不存在则创建一个新的文件目录
        File parentFile = uploadFile.getParentFile();
        if(!parentFile.exists()){
            parentFile.mkdir();
        }

        String url;
        //上传文件到磁盘
        file.transferTo(uploadFile);
        //获取文件的md5
        String md5 = SecureUtil.md5(uploadFile);
        //从数据库查询是否存在相同的记录
        Files dbFiles = getFileByMd5(md5);
        if (dbFiles != null){
            url = dbFiles.getUrl();
            //由于文件已存在，所以删除刚才上传的重复文件
            uploadFile.delete();
        }else {
            //数据库不存在重复文件，则不删除刚才上传的文件
            url = "http://localhost:8090/file/" + fileUUID;
        }


        //存储数据库
        Files saveFile = new Files();
        saveFile.setName(originalFilename);
        saveFile.setType(type);
        saveFile.setSize(size/1024);
        saveFile.setUrl(url);
        saveFile.setMd5(md5);
        saveFile.setIsDelete(false);
         saveFile.setEnable(true);
        fileMapper.insert(saveFile);
        return url;
    }

    /**
     * 文件下载路径  http://localhost:8090/file/
     * @param fileUUID
     * @param response
     * @throws IOException
     */
    @GetMapping("/{fileUUID}")
    public void download(@PathVariable String fileUUID,HttpServletResponse response) throws IOException{
        //根据文件的唯一标识码获取文件
        File uploadFile = new File(fileUploadPath + fileUUID);
        //设置输出流的格式
        ServletOutputStream os = response.getOutputStream();
        response.addHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileUUID,"UTF-8"));
        response.setContentType("application/octet-stream");

        //读取文件的字节流
        os.write(FileUtil.readBytes(uploadFile));
        os.flush();
        os.close();
    }

    /**
     * 通过文件的md5查询文件
     * @param md5
     * @return
     */
    private Files getFileByMd5(String md5){
        //查询文件的md5是否存在
        QueryWrapper<Files> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("md5",md5);
        List<Files> filesList = fileMapper.selectList(queryWrapper);
        return filesList.size() == 0 ? null : filesList.get(0);
    }

    @PostMapping("/update")
    public Result update(@RequestBody Files files){
        return Result.suc(fileMapper.updateById(files));

    }

    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id){
        Files files = fileMapper.selectById(id);
       // files.setIsDelete(0);//这一段改了实体类的，布尔改成了int
        files.setIsDelete(false);
        fileMapper.updateById(files);
        return Result.suc();
    }

    @PostMapping("/del/batch")
    public Result deleteBatch(@RequestBody List<Integer> ids){
        QueryWrapper<Files> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("id",ids);
        List<Files> files = fileMapper.selectList(queryWrapper);
        for (Files file : files){
          //  file.setIsDelete(0);//这一段改了实体类的，布尔改成了int
            file.setIsDelete(false);
            fileMapper.updateById(file);
        }
        return Result.suc();
    }

    /**
     * 分页查询接口
     * @param pageNum
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public Result findPage(@RequestParam Integer pageNum,
                           @RequestParam Integer pageSize,
                           @RequestParam(defaultValue = "") String name){
        QueryWrapper<Files> queryWrapper = new QueryWrapper<>();
        //查询未删除的记录
//        queryWrapper.in("is_delete",0,null);
        queryWrapper.orderByDesc("id");
        if (!"".equals(name)){
            queryWrapper.like("name",name);
        }
        //先定义page，然后把page类里的total的值定义赋值给Result类定义的total；
        Page page  = new Page<>(pageNum,pageSize);
        fileMapper.selectPage(page,queryWrapper);
        return Result.suc(fileMapper.selectPage(page,queryWrapper),page.getTotal());
    }
//    @AuthAccess //这个注解的作用是放开权限，方便通过接口测试,如果去掉的话就需要token的登录权限认证,或者手动去InterceptorConfig添加放行路径
//    @PostMapping("/upload")
//    public Result upload(MultipartFile file) throws IOException{
//        String originalFilename = file.getOriginalFilename(); // 文件的原始名称，例如：aaa.png
//        String mainName = FileUtil.mainName(originalFilename); // 主文件名，例如：aaa
//        String extName = FileUtil.extName(originalFilename); // 文件的后缀，例如：png
////        String projectPath = System.getProperty("user.dir"); // 项目路径
////        String filesPath = projectPath + "\\files"; // 文件存储的目录
//        //File parentFile = new File(ROOT_PATH);
//        if (!FileUtil.exist(ROOT_PATH)) {
//            FileUtil.mkdir(ROOT_PATH); // 如果当前文件的父级目录不存在，就创建
//
//        }
//        //File saveFile = new File(ROOT_PATH +File.separator+ originalFilename); // 文件的完整路径，
//        if (FileUtil.exist(ROOT_PATH +File.separator+ originalFilename)) { // 如果当前上传的文件已经存在了，那么这个时候我就需要重新命名文件名称
//            originalFilename = System.currentTimeMillis() + "_" + mainName + "." + extName;
//
//        }
//        File saveFile = new File(ROOT_PATH +File.separator+ originalFilename);
//        file.transferTo(saveFile); // 存储文件到本地的磁盘里面去
//        String url = "http://" + ip + ":" + port + "/file/download/" + originalFilename;
//
//        return Result.suc(url);//返回文件的链接，这个链接就是下载地址，这个地址就是一会我后台提供的
//    }
//
//    @AuthAccess //这个注解的作用是放开权限，方便通过接口测试，下载的话就必须要权限放行
//    @GetMapping("/download/{fileName}")
//    public void download(@PathVariable String fileName,HttpServletResponse response) throws IOException{
//        //response.addHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName,"UTF-8")); //附件下载
//        response.addHeader("Content-Disposition","inline;filename=" + URLEncoder.encode(fileName,"UTF-8"));//预览
//        String filePath = ROOT_PATH + File.separator + fileName;
//        if(!FileUtil.exist(filePath)){
//            return;
//        }
//        byte[] bytes = FileUtil.readBytes(filePath);
//        ServletOutputStream outputStream = response.getOutputStream();
//        outputStream.write(bytes);
//        outputStream.flush();
//        outputStream.close();
//    }



}

